/*
 * tls_var.cpp
 *
 *  Created on: 2016年4月22日
 *      Author: guyadong
 */
#include "tls_var.h"
#include "facecl_context.h"
namespace gdface{
/* 当前线程使用的cl::Command_Queue对象,需要set_command_queue函数初始化后才能使用 */
thread_local cl::CommandQueue _tls_command_queue;
/* 当前线程使用的cl::Context对象 */
thread_local cl::Context _tls_context;
/* 当前线程使用的cl::Device对象 */
thread_local cl::Device _tls_device;
/* 当前线程使用的cl::Device类型 */
thread_local cl_device_type _tls_device_type=0;
/* 当前线程使用的cl::Device每个CU的PE数目 */
thread_local std::pair<size_t, size_t> _tls_pe_num_per_cu{0,0};
thread_local cl_ulong _tls_constant_buffer_size=0;
/*
 * 获取当前线程的cl::Command_Queue对象
 * 如果cl::Command_Queue对象无效，就调用global_facecl_context::new_command_queue创建一个
 * 为保证当前线程内所有的kernel函数顺序执行，应该使用本函数来获取cl::CommandQueue
 * */
cl::CommandQueue & tls::command_queue(){
	if(!_tls_command_queue()){
		// 对象无效时，先初始化
		_tls_command_queue=global_facecl_context.new_command_queue();
	}
	return _tls_command_queue;
}
/*
 * 获取当前线程使用的cl::Context对象
 * */
const cl::Context & tls::context(){
	if(!_tls_context()){
		// 对象无效时，先初始化
		_tls_context =command_queue().getInfo<CL_QUEUE_CONTEXT>();
	}
	return _tls_context;
}
/*
 * 获取当前线程的cl::Device象
 * 如果cl::Device对象无效，就调用global_facecl_context::getDevice获取
  * */
const cl::Device& tls::device(){
	if(!_tls_device()){
		// 对象无效时，先初始化
		_tls_device=command_queue().getInfo<CL_QUEUE_DEVICE>();
	}
	return _tls_device;
}

/*
 * 获取当前线程的设备类型
  * */
cl_device_type tls::device_type(){
	if(0==_tls_device_type){
		// 设备类型无效时，先初始化
		_tls_device_type=device().getInfo<CL_DEVICE_TYPE>();
	}
	return _tls_device_type;
}
/*
 * 获取当前线程的设备每个CU的PE数目
  * */
const std::pair<size_t, size_t>& tls::pe_num_per_cu(){
	if(0==_tls_pe_num_per_cu.first){
		// 数据无效时，先初始化
		_tls_pe_num_per_cu=global_facecl_context.getPENumPerCU();
	}
	return _tls_pe_num_per_cu;
}
/*
 * 获取当前线程的设备常量缓冲区大小
  * */
cl_ulong tls::constant_buffer_size(){
	if(0==_tls_constant_buffer_size){
		_tls_constant_buffer_size=device().getInfo<CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE>();
	}
	return _tls_constant_buffer_size;
}
}/* namespace gdface */




